/**
 * File: PaisMB.java
 * Data: 11.11.2010
 * Objective: Criar a classe managed bean da entidade que represnta o Modelo o Pais.
 *
 * Copyright 2010 S2DZ CORPORATION
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package mbeans;

import controller.PaisController;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.event.AjaxBehaviorEvent;
import modelo.PaisModelo;
import org.richfaces.component.UIExtendedDataTable;

/**
 * Managed Bean da entidade que represnta o Modelo do Produto.
 * @author Paulo Ilenga
 */
@ManagedBean
@ViewScoped
public class PaisMB implements Serializable
{

    private PaisController controller;
    private PaisModelo modelo;
    private PaisModelo modeloTemp;
    private List<PaisModelo> seleccionados = new ArrayList<PaisModelo>();
    private Collection<Object> selection;
    private FacesContext context;

    /** Constructor da classe sem argumentos */
    public PaisMB()
    {
        controller = new PaisController();
        modelo = new PaisModelo();
        modeloTemp = new PaisModelo();
    }

//------------------------inicio dos Métodos set e get---------------------------------
    public PaisController getController()
    {
        return controller;
    }

    public void setController(PaisController controller)
    {
        this.controller = controller;
    }

    public PaisModelo getModelo()
    {
        return modelo;
    }

    public void setModelo(PaisModelo modelo)
    {
        this.modelo = modelo;
    }

    public PaisModelo getModeloTemp()
    {
        return modeloTemp;
    }

    public void setModeloTemp(PaisModelo modeloTemp)
    {
        this.modeloTemp = modeloTemp;
    }

    public List<PaisModelo> getTodosTable()
    {
        return controller.getTodos(false);
    }

    public List<PaisModelo> getTodosCombo()
    {
        return controller.getTodos(true);
    }

    public List<PaisModelo> getSeleccionados()
    {
        return seleccionados;
    }

    public void setSeleccionados(List<PaisModelo> seleccionados)
    {
        this.seleccionados = seleccionados;
    }

    public Collection<Object> getSelection()
    {
        return selection;
    }

    public void setSelection(Collection<Object> selection)
    {
        this.selection = selection;
    }

    //-----------------------fim dos métodos set e get------------------------------
    public void selectionListener(AjaxBehaviorEvent event)
    {
        UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();

        Object originalKey = dataTable.getRowKey();

        seleccionados.clear();

        for (Object selectionKey : selection)
        {
            dataTable.setRowKey(selectionKey);

            if (dataTable.isRowAvailable())
            {
                seleccionados.add((PaisModelo) dataTable.getRowData());
            }
        }

        if (modeloTemp.getId() != seleccionados.get(0).getId())
        {
            modeloTemp = seleccionados.get(0);
        }
        dataTable.setRowKey(originalKey);
    }

    /**
     * Método salvar da classe
     */
    public void salvar()
    {
        context = FacesContext.getCurrentInstance();

        if (!modelo.getCodigo().equals(""))
        {
            if (!modelo.getNome().equals(""))
            {
                if (!modelo.getMoeda().equals(""))
                {
                    if (controller.save(modelo))
                    {
                        modelo = new PaisModelo();
                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", "REGISTO GUARDADO COM SUCESSO!"));
                    } else
                    {
                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO GUARDAR O REGISTO! CONSULTE O SUPORTE."));
                    }
                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE ESCOLHER A MOEDA!"));
                }
            } else
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE PREENCHER O NOME!"));
            }
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE SELECCIONAR O CODIGO!"));
        }

    }

    /**
     * Método que actualiza os dados do registo.
     */
    public void actulizar()
    {
        context = FacesContext.getCurrentInstance();

        if (modeloTemp.getId() != 0)
        {
            if (!modeloTemp.getCodigo().equals(""))
            {
                if (!modeloTemp.getNome().equals(""))
                {
                    if (!modeloTemp.getMoeda().equals(""))
                    {
                        if (controller.update(modeloTemp))
                        {
                            modeloTemp = new PaisModelo();
                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", "REGISTO ACTUALIZADO COM SUCESSO!"));
                        } else
                        {
                            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO ACTUALIZAR O REGISTO! CONSULTE O SUPORTE."));
                        }
                    } else
                    {
                        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE PREENCHER A MOEDA!"));
                    }
                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE PREENCHER O NOME DO PAÍS!"));
                }
            } else
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UG002: DEVE PREENCHER O CODIGO!"));
            }
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "AVISO N.º UA002: DEVE SELECCIOAR UM REGISTO!"));
        }
    }

    /**
     * Método que elimina os dados do registo.
     */
    public void eliminar()
    {
        context = FacesContext.getCurrentInstance();

        if (!seleccionados.isEmpty())
        {

            for (PaisModelo modeloEliminar : seleccionados)
            {

                if (controller.eliminar(modeloEliminar.getId(), "tbl_pais"))
                {
                } else
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO N.º SG001: AO ELIMINAR O(S) REGISTO(S)! CONSULTE O SUPORTE."));
                    break;
                }
            }
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "", seleccionados.size() + " REGISTO(S) ELIMINADO(S) COM SUCESSO!"));
        } else
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "ERRO AVISO N.º UE001: DEVE SELECCIONAR PELO MENOS UM REGISTO."));
        }
    }

    /**
     * Método que limpa os atributos da entidade.
     */
    public void limpar()
    {
        modeloTemp.setId(0);
        modeloTemp.setNome("");
    }

    /**
     * Métodos que cria uma nova instância do objecto modelo.
     */
    public void novoModelo()
    {
        modeloTemp = new PaisModelo();
    }

    @FacesConverter(forClass = PaisModelo.class)
    public static class ClassConverter implements Converter
    {

        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value)
        {
            if (value == null || value.length() == 0)
            {
                return null;
            }

            PaisMB paisMB = (PaisMB) context.getApplication().getELResolver().
                    getValue(context.getELContext(), null, "paisMB");

            return paisMB.controller.getById(Integer.valueOf(value));

        }

        @Override
        public String getAsString(FacesContext context, UIComponent component, Object object)
        {
            if (object == null)
            {
                return null;
            }
            if (object instanceof PaisModelo)
            {
                PaisModelo o = (PaisModelo) object;
                return String.valueOf(o.getId());
            } else
            {
                throw new IllegalArgumentException("object " + object + " is of type "
                        + object.getClass().getName() + "; expected type: " + PaisModelo.class.getName());
            }
        }
    }
}
